<?php
namespace App\Http\Controllers;

use Image;
use GDText\Box;
use GDText\Color;

class ImageController extends Controller {

    public function index()
    {
        
        $im = imagecreatetruecolor(750, 300);
        $backgroundColor = imagecolorallocate($im, 0, 0, 0);
        imagecolortransparent($im,$backgroundColor);
        imagefill($im, 0, 0, $backgroundColor);
        
        $box = new Box($im);
        $box->setFontFace(storage_path('app')."/zhanku.ttf"); // http://www.dafont.com/minecraftia.font
        $box->setFontColor(new Color(255, 75, 140));
        $box->setTextShadow(new Color(0, 0, 0, 50), 2, 2);
        $box->setFontSize(30);
        $box->setLineHeight(1.5);
        //$box->enableDebug();
        $box->setBox(20, 20, 750, 300);
        $box->setTextAlign('left', 'top');
        $string = "    另外，字符串的切片操作和字节类型切片的切片操作是类似的.并且都是返回一个原始字节系列的子序列，底层都是共享之前的底层数组，因此这种操作都是常量时间复杂度。切片操作对于字符串则生成一个新字符串，如果x是的话则生成一个新的byte。因为slice值包含指向第一个slice元素的指针，因此向函数传递slice将允许在函数内部只是对底层的数组创建了一个新的别下面的reverse函数在原内存空间将int类型的slice反转，而且它可以用于任意长度的slice。";
        $txt = self::autoWrap(30,storage_path('app')."/zhanku.ttf",$string,690);
        $box->draw(
            $txt
        );
        
        header("Content-type: image/png;");
        imagepng($im, null, 9, PNG_ALL_FILTERS);
    }

   /**
 * 根据预设宽度让文字自动换行
 * @param int $fontsize 字体大小
 * @param string $ttfpath 字体名称
 * @param string $str 字符串
 * @param int $width 预设宽度
 * @param int $fontangle 角度
 * @param string $charset 编码
 * @return string $_string  字符串
 */
protected static function autoWrap($fontsize, $ttfpath, $str, $width, $fontangle = 0, $charset = 'utf-8')
{
    $_string = "";
    $_width = 0;
    $temp = self::chararray($str, $charset);
    foreach ($temp[0] as $v) {
        $w = self::charWidth($fontsize, $fontangle, $v, $ttfpath);
        $_width += intval($w);
        if (($_width > $width) && ($v !== "")) {
            $_string .= PHP_EOL;
            $_width = 0;
        }
        $_string .= $v;
    }
    return $_string;
}
/**
 * 返回一个字符的数组
 *
 * @param string $str 文字
 * @param string $charset 字符编码
 * @return array $match   返回一个字符的数组
 */
public static function charArray($str, $charset = "utf-8")
{
    $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
    $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
    $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
    $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
    preg_match_all($re[$charset], $str, $match);
    return $match;
}
/**
 * 返回一个字符串在图片中所占的宽度
 * @param int $fontsize 字体大小
 * @param int $fontangle 角度
 * @param string $ttfpath 字体文件
 * @param string $char 字符
 * @return int $width
 */
protected static function charWidth($fontsize, $fontangle, $char, $ttfpath)
{
    $box = @imagettfbbox($fontsize, $fontangle, $ttfpath, $char);
    $width = max($box[2], $box[4]) - min($box[0], $box[6]);
    return $width;
}

}